/* 
 * Constants.java      1.00    2010-06-10 
 *
 * Copyright (c) 2010 leewan. All Rights Reserved.
 * 
 * This software is the confidential and proprietary information
 * of leewan.  You shall not disclose such Confidential Information
 * and shall use it only in accordance with the terms of the license agreement
 * you entered into with leewan.
 */
package doit.framework.util;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;

/**
 * <pre>
 * system      : 공통
 * menu        : 공통
 * source      : Constants.java
 * description : 공통 상수 관리
 * </pre> 
 * @version
 * <pre> 
 * 1.0  2008-01-11  leewan  최초 작성
 * 1.1  
 * </pre>
 */

@SuppressWarnings("unchecked")

public class Constants extends HashMap{
	
	private static final long serialVersionUID = 7821848383895528070L;

	public static Map map;
	
	// debug
	public static final boolean DEBUG_MODE = false;

	// mime
    public static final String MIME_PLAIN = "text/plain";
    public static final String MIME_HTML = "text/html";
    public static final String MIME_JS = "text/javascript;charset=UTF-8";
    public static final String MIME_CSS = "text/css";
    public static final String MIME_HTC = "text/x-component";

    // file
	public static final String PACKAGE = "/tims/framework";
    public static final String FILE_TIMS_JS = PACKAGE + "/war/script";
    public static final String FILE_TIMS_CSS = PACKAGE + "/war/css";
    public static final String FILE_TIMS_XML = PACKAGE + "/tims.xml";
    public static final String FILE_JS = ".js";
    public static final String FILE_CSS = ".css";
    public static final String FILE_HTC = ".htc";
    public static final String SCRIPT_TAG_PROTECTION = "throw 'allowScriptTagRemoting is false.';";
    public static final String CONTROLLER = ".do";
	
	// common parameter
    public static final	String		PM_METHOD									= "method";	// Method
    public static final	String		PM_SYSTEM_DIV								= "sd";	// 시스템구분
    public static final	String		PM_MENU_DIV									= "md"; // 메뉴 구분
    public static final	String		PM_MENU_SEQ									= "ms"; // 메뉴 일련번호
    public static final	String		PM_PROGRAM_SEQ								= "ps"; // 프로그램 일련번호
    public static final	String		PM_USER_ID									= "ui"; // 회원 아이디
    public static final	String		PM_GROUP_SEQ								= "gs"; // 그룹 일련번호
    public static final	String		PM_BOARD_SEQ								= "bs"; // 게시판 일련번호
    
    // select tag의 label/value 컬럼 정의
    public static final	String		OPTION_VALUE_CODE							= "smallDiv";
    public static final	String		OPTION_LABEL_CODE							= "contentsDescr";
    public static final	String		OPTION_VALUE_GROUP							= "groupSeq";
    public static final	String		OPTION_LABEL_GROUP							= "groupName";
    public static final	String		OPTION_VALUE_SYSTEM							= "systemDiv";
    public static final	String		OPTION_LABEL_SYSTEM							= "systemName";
    public static final	String		OPTION_VALUE_EXPCNTRCD						= "expCntrCd";
    
    // select tag의 default option type 정의
    public static final	String		DEFAULT_OPTION_TYPE_ALL						= "A";
    public static final	String		DEFAULT_OPTION_TYPE_SELECT					= "S";
    
    // method param value
    public static final String		VL_METHOD_INIT								= "init";		// Defualt
    public static final String		VL_METHOD_PAGE_LIST							= "pageList";	// 페이징된 목록
    public static final String		VL_METHOD_LIST								= "list";		// 전체 목록
    public static final String		VL_METHOD_VIEW								= "view";		// 상세
    public static final String		VL_METHOD_INSERT_FORM						= "insertForm";	// 입력화면
    public static final String		VL_METHOD_UPDATE_FORM						= "updateForm";	// 수정화면
    public static final String		VL_METHOD_INSERT							= "insert";		// 입력처리
    public static final String		VL_METHOD_UPDATE							= "update";		// 수정처리
    public static final String		VL_METHOD_UPDATE_FIELD						= "updateField";// 수정처리
    public static final String		VL_METHOD_DELETE							= "delete";		// 한건 삭제처리
    public static final String		VL_METHOD_DELETE_ALL						= "deleteAll";	// multi row 삭제 처리
    
    public static final String		VL_DELIMETER								= "";						// 분리형 문자
    public static final String		VL_EMPTY									= "";						// 빈 문자
    public static final String		VL_NULL										= "null";					// 'null' 문자
    public static final String		VL_YES										= "Y";						// 'Y' 문자
    public static final String		VL_NO										= "N";						// 'N' 문자
    public static final String		VL_REDIRECT									= "redirect:";				// 리다이렉트  문자
    public static final String		VL_USERMAP									= "userMap";				// 사용자정보 맵 PREFIX
    public static final String		VL_REDIRECT_PREFIX							= "/";						// 리다이렉트  문자
    public static final String		VL_LOCATION									= "location";			    // 현재 경로 문자
    public static final String		VL_PARAMETER_START_PREFIX					= "?";						// 파라미터 시작 구분 문자 
    public static final String		VL_PARAMETER_ADD_PREFIX						= "&";						// 파라미터 추가 구분 문자
    public static final String		VL_PARAMETER_VALUE_PREFIX					= "=";						// 파라미터 값 구분 문자
    
    public static final String		VL_GET										= "get";					// get
    public static final String		VL_SET										= "set";					// set
    
    // 파일 사이즈 환경변수
    public static final String		VL_MB										= " MB";					// 파일 MB 문자
    public static final String		VL_KB										= " KB";					// 파일 KB 문자
    public static final String		VL_MB_PATTERN								= "#,##0.0#";				// 파일 MB 패턴 문자
    public static final String		VL_KB_PATTERN								= "#,##0";					// 파일 KB 패턴 문자
    
    public static final String		VL_NUMBER_PATTERN							= "#,##0";					// 숫자 패턴 문자
    
    public static final String		VL_HEX_25									= "%";						// %  문자
    public static final String		VL_HEX_26									= "&";						// &  문자
    public static final String		VL_HEX_2F									= "/";						// /  문자
    public static final String		VL_HEX_3D									= "=";						// =  문자
    public static final String		VL_HEX_3F									= "?";						// ?  문자
    public static final String		VL_HEX_0A									= "\n";						// \n 문자
    
    public static final String		VL_TRANS_HEX_25								= "%25";					// %  변환 문자
    public static final String		VL_TRANS_HEX_26								= "%26";					// &  변환 문자
    public static final String		VL_TRANS_HEX_2F								= "%2F";					// /  변환 문자
    public static final String		VL_TRANS_HEX_3D								= "%3D";					// =  변환 문자
    public static final String		VL_TRANS_HEX_3F								= "%3F";					// ?  변환 문자
    public static final String		VL_TRANS_HEX_0A								= "%0A";					// \n 변환 문자
    
    // 메세지변수
    public static final String		VL_MESSAGE_BASE_NAME						= "message";
    
    // 인증 관련
    public static final String      VL_LOGIN_SUCCESS                            = "0";                      // 로그인 성공하였습니다.
    public static final String      VL_NO_ACCOUNT_EXIST                         = "1";                      // 사용자가 존재하지 않습니다.
    public static final String      VL_WRONG_PASSWORD                           = "2";                      // 잘못된 패스워드입니다.
    public static final String      VL_NO_ACCOUNT_EXIST_OR_WRONG_PASSWORD       = "3";                      // 사용자가 존재하지 않거나 비밀번호가 틀립니다.
    public static final String      VL_USER_ACCOUNT_LOCKED                      = "4";                      // 잠겨있는 계정입니다.
    public static final String      VL_ACCESS_FROM_RESTRICTED_IP                = "5";                      // 제한된 IP 에서의   접근입니다.
    public static final String      VL_OVERLIMIT_ACCESS_AMOUNT                  = "6";                      // 최대 로그인 사용자를 초과하였습니다.
    public static final String      VL_ACCOUNT_BEEING_USED                      = "7";                      // 이미 접속된 사용자가 있습니다.
    public static final String      VL_CHANGE_PASSWORD_BRFORE_LOGIN             = "8";                      // 비밀번호를 변경하여 주십시오.
    
	public Constants() {
		if( map != null) return;
		
		map = new HashMap();
		
		Class c = this.getClass();
		Field[] fields = c.getDeclaredFields();
		
		for( int i=0; i < fields.length; i++) {
			Field field = fields[i];
			int modifier = field.getModifiers();
			if( Modifier.isFinal( modifier) && !Modifier.isPrivate( modifier)){
				try {
					this.put( field.getName(), field.get( this));
				}
				catch( IllegalAccessException e){
				}
			}
		}
	}
	
	public Object get( Object key){
		if (key.equals("VL_CONTEXT")) 
			return this.put("VL_CONTEXT", SharedMethods.getRequest().getContextPath());
		else
			return map.get( key);
	}
	
	public Object put( Object key, Object value){
		Object preValue = map.get(key);
		map.put( key, value);
		
		return preValue;
	}
}
